# 导入类库
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_mail import Mail
from flask_moment import Moment
from flask_login import LoginManager
from flask_uploads import UploadSet,IMAGES,configure_uploads,patch_request_class
from flask_caching import Cache
import os

# 创建对象
bootstrap=Bootstrap()
db=SQLAlchemy()
migrate=Migrate(db=db)
mail=Mail()
moment=Moment()
login_manager=LoginManager()
pictures=UploadSet('pictures',IMAGES)
cache=Cache()

config={ # 其他配置在https://flask-caching.readthedocs.io/en/latest/
    'CACHE_TYPE':'redis', # 缓存类型
    'CACHE_REDIS_HOST':os.getenv('CACHE_REDIS_HOST') or '192.168.61.134', # 前面是云服务器IP，后面是虚拟机，都装了redis，都要允许远程访问
    'CACHE_REDIS_PORT':6379,
    'CACHE_REDIS_PASSWORD':os.environ.get('CACHE_REDIS_PASSWORD') or '' # redis有密码时要写密码，否则连不上
}


# 初始化对象
def extensions_config(app):
    bootstrap.init_app(app)
    db.init_app(app)
    migrate.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    login_manager.init_app(app)
    login_manager.login_view='user.login' # 未登录时访问"需要登录才能访问的页面"时，跳转到登录页。跳转后URL中有next参数，表示登录后跳回刚才的页面，即需要登录才能访问的页面。和myself_base.html中url_for()里一样，蓝本名.视图函数名
    login_manager.login_message='登录后才能访问这部分内容' # 未登录时访问"需要登录才能访问的页面"时，跳转到登录页时的flash提示，不设置时默认是一句英语
    configure_uploads(app,pictures)
    patch_request_class(app,size=None) # 设为None时config.py中MAX_CONTENT_LENGTH生效
    cache.init_app(app=app,config=config) # 初始化缓存文件，将缓存放在redis